package vista.ventanaTarea;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import modelo.Proyecto;
import vista.tableModel.TableModelTarea;
import vista.ventanaEstadoTarea.VentanaTarea;

/**
 * @author Natalia Stefania 
 */

public class VerTareas extends Observable implements Observer{
	
	// Variables  *********************************************************** //
	private JButton agregar, editar, eliminar, masInformacion, verTarea, verAsignaciones, volver;  
	private JPanel panel, panelEste;  
	private JTable tablaDeTareas;
	private JFrame frame;
	private Proyecto proyectoObserver;
	private TableModelTarea tableModel;
	
	// GETTER & SETTER **************************************************** //
	public Proyecto getProyectoObserver() {
		return proyectoObserver;
	}

	public void setProyectoObserver(Proyecto proyectoObserver) {
		this.proyectoObserver = proyectoObserver;
	}

	public TableModelTarea getTableModel() {
		return tableModel;
	}

	public void setTableModel(TableModelTarea tableModel) {
		this.tableModel = tableModel;
	}

	// Constructor  ******************************************************** //
	public VerTareas(Proyecto proyectoObserver) {
		this.agregar= new JButton("Agregar"); 
		this.editar= new JButton("Editar"); 
		this.eliminar= new JButton("Eliminar");
		this.volver= new JButton ("Volver");
		this.masInformacion= new JButton("Mas informacion"); 
		this.verAsignaciones= new JButton("Ver Asignaciones"); 
		this.verTarea= new JButton("Estado Tarea");
		this.panel= new JPanel (); 
		this.panelEste= new JPanel (); 
		this.frame= new JFrame ("Tareas de: "+ proyectoObserver.getNombre() ); 	
		this.proyectoObserver= proyectoObserver;  
		this.proyectoObserver.addObserver(this);
		
		// Agrego a los paneles los botones y muestro la lista de tareas de un proyecto
		this.init();
	}
	
	// Metodos  *********************************************************** //
	/**
	 * Crea la tabla de las tareas que contiene un proyecto
	 */
	public void crearGrilla (){
		// creamos el modelo de Tabla
        tableModel= new TableModelTarea();

        // se crea la Tabla con el modelo DefaultTableModel
        this.tablaDeTareas = new JTable(tableModel);
        
        // insertamos las columnas
        tableModel.addColumn ("Nombre");
        tableModel.addColumn("Importancia");
        tableModel.addColumn("Estimacion");
        tableModel.addColumn("finalizacion Estimada");
        tableModel.addColumn("Simple/Compuesta"); 
        
        // insertamos las filas
        tableModel.actualizarme(this.proyectoObserver.getTareas());
        
        //Creamos un JscrollPane y le agregamos la JTable
        JScrollPane scrollPane = new JScrollPane(tablaDeTareas);

        //Agregamos el JScrollPane al contenedor
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
	}
	
	public JTable getTablaDeTareas() {
		return tablaDeTareas;
	}

	public void setTablaDeTareas(JTable tablaDeTareas) {
		this.tablaDeTareas = tablaDeTareas;
	}

	/**
	 * Inicializa los componentes
	 */
	public void init (){
		this.crearGrilla(); 
		
		this.panelEste.setLayout(new BoxLayout(panelEste, BoxLayout.Y_AXIS));
		this.panelEste.add(agregar);
		this.panelEste.add(editar);
		this.panelEste.add(eliminar);
		this.frame.getContentPane().add(panelEste, BorderLayout.EAST);
		
		this.panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
		this.panel.add(masInformacion);
		this.panel.add(verAsignaciones);
		this.panel.add(verTarea);
		this.panel.add(volver); 
		this.frame.getContentPane().add(panel,BorderLayout.SOUTH);
		
		// A cada boton le agrego su funcionalidad 
		this.volver.addActionListener(new BotonVolverListener ());
		this.agregar.addActionListener(new BotonAgregarListener());
		this.editar.addActionListener(new BotonEditarListener());
		this.eliminar.addActionListener (new BotonEliminarListener ());
		this.verAsignaciones.addActionListener(new BotonVerAsignaciones()); 
		this.masInformacion.addActionListener(new BotonMasInformacion ()); 
		this.verTarea.addActionListener(new BotonAbrirEstadoTareas());
		
		this.frame.setSize(700, 300);
		this.frame.setVisible(true);
		
		this.frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE);
	}
	
	/**
	 * Este boton, tendra como funcion cerrar la aplicacion
	 */
	public class BotonVolverListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			frame.dispose(); 
		}
	}
	
	/**
	 * Este boton tiene como funcionalidad crear una tarea nueva y actualizar la tabla
	 */
	public class BotonAgregarListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			tableModel.getDataVector().removeAllElements();

			new AgregarTareaAlProyecto (VerTareas.this.proyectoObserver);
		}		
	}
	
	/**
	 * Este boton editara una tarea, y actualizara la tabla
	 */
	public class BotonEditarListener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try{
				EditarTareaPanel editTaskPanel= new EditarTareaPanel(proyectoObserver.getTareas().get(tablaDeTareas.getSelectedRow()), VerTareas.this);
				editTaskPanel.mostrarDatosEnPantalla();
			
				tablaDeTareas.updateUI();
			}				
			// En caso que una tarea no este seleccionada maneja la excepcion
			catch(ArrayIndexOutOfBoundsException e){
				JOptionPane.showMessageDialog(panel, "Seleccione la tarea primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
			// En caso que no halla ninguna tarea creada dentro del proyecto maneja la excepcion
			catch (NullPointerException e) {
				JOptionPane.showMessageDialog(panel, "No tiene ninguna tarea creada. Por favor, cree alguna tarea",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
	/**
	 * Este boton eliminara una tarea seleccionada y actualizar la lista de tareas que contiene el proyecto
	 */
	public class BotonEliminarListener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try{
				// Elimina la Tarea seleccionada
				proyectoObserver.eliminarTarea(proyectoObserver.getTareas().get(tablaDeTareas.getSelectedRow()));
				tableModel.getDataVector().remove(tableModel.getDataVector().get(tablaDeTareas.getSelectedRow()));
				
				//Actualiza la lista de tareas
				tablaDeTareas.updateUI();
			}
			// En caso que una tarea no este seleccionada maneja la excepcion
			catch(ArrayIndexOutOfBoundsException e){
				JOptionPane.showMessageDialog(panel, "Seleccione la tarea primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
			// En caso que no halla ninguna tarea creada dentro del proyecto maneja la excepcion
			catch (NullPointerException e) {
				JOptionPane.showMessageDialog(panel, "No tiene ninguna tarea creada. Por favor, cree alguna tarea",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
	/**
	 * Mostrara las asignaciones que tiene la tarea seleccionada
	 */
	public class BotonVerAsignaciones implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {			
			try{					
				new VerAsignaciones(proyectoObserver.getTareas().get(tablaDeTareas.getSelectedRow()),
						proyectoObserver);
			}
			// En caso que una tarea no este seleccionada maneja la excepcion
			catch(ArrayIndexOutOfBoundsException e){
				JOptionPane.showMessageDialog(panel, "Seleccione la tarea primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
			// En caso que no halla ninguna tarea creada dentro del proyecto maneja la excepcion
			catch (NullPointerException e) {
				JOptionPane.showMessageDialog(panel, "No tiene ninguna tarea creada. Por favor, cree alguna tarea",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
	/**
	 * Mostrara en otra ventana los campos de la tarea (Predecesor y TareasQueComponen)
	 */
	public class BotonMasInformacion implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try {
				MasInformacion informacionDeLaTarea = new MasInformacion (
						proyectoObserver.getTareas().get(tablaDeTareas.getSelectedRow()));
				informacionDeLaTarea.informacionDeLaTarea(); 
			}
			// En caso que una tarea no este seleccionada maneja la excepcion
			catch (ArrayIndexOutOfBoundsException e) {
					JOptionPane.showMessageDialog(panel, "Seleccione la tarea primero",
							"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
			// En caso que no halla ninguna tarea creada dentro del proyecto maneja la excepcion
			catch (NullPointerException e) {
				JOptionPane.showMessageDialog(panel, "No tiene ninguna tarea creada. Por favor, cree alguna tarea",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}	
		}
	}
	
	/**
	 * Este boton saltara a otra ventana que mostrara el estado de las tareas seleccionadas. En el mismo podes 
	 * cambiar el estado de la misma
	 */
	public class BotonAbrirEstadoTareas implements ActionListener {
		public void actionPerformed (ActionEvent arg0){
			System.out.println(tablaDeTareas.getSelectedRow());
			try {
				new VentanaTarea(proyectoObserver.getTareas().get(tablaDeTareas.getSelectedRow()));
			}
			// En caso que una tarea no este seleccionada maneja la excepcion
			catch (ArrayIndexOutOfBoundsException e) {
					JOptionPane.showMessageDialog(panel, "Seleccione la tarea primero",
							"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
			// En caso que no halla ninguna tarea creada dentro del proyecto maneja la excepcion
			catch (NullPointerException e) {
				JOptionPane.showMessageDialog(panel, "No tiene ninguna tarea creada. Por favor, cree alguna tarea",
						"Mensaje", JOptionPane.ERROR_MESSAGE); 
			}
		}
	}
	
	@Override
	public void update(Observable o, Object arg) {
		tableModel.actualizarme(this.proyectoObserver.getTareas());
	}
}
